前端analysis | What,Why,Who,When,Where,How

《Css3》- 如何成为一名前端开发者之Javascript高级

2020-08-25

Javascript

介绍

概要

  • js 使动态内容更新成为可能
  • web page js分: browser api, third api
  • js 存在执行顺序
  • js 属于解释性语言,逐句解释逐句执行,得到返回结果,返回结果可能参与下句执行。
  • js 字符串文本执行,采用just-in-time 编译改进运行时性能,依然是解释性语言。

async | defer

  • js 相关的dom操作,需要dom存在;或者为了提升性能,我们添加async and defer。

    相同点: 不阻塞dom解释,渲染
    不同点: async: js彼此不能有依赖;defer,彼此之间按顺序加载,于依赖。

使用注意事项

定义事项

  • 尽可能使用let,避免var,减少重复变量定义,引起的逻辑错误
  • 类定义了属性和方法
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    function Person(first, last, age, gender, interests) {
    this.name = {
    first : first,
    last : last
    };
    this.age = age;
    this.gender = gender;
    this.interests = interests;
    this.bio = function() {
    alert(this.name.first + ' ' + this.name.last + ' is ' + this.age + ' years old. He likes ' + this.interests[0] + ' and ' + this.interests[1] + '.');
    };
    this.greeting = function() {
    alert('Hi! I\'m ' + this.name.first + '.');
    };
    }

对象创建方法

  • 字面量 var obj = {a:2,age:28}
  • function new 创建
  • new Object()
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    let person1 = new Object();
    person1.name = 'Chris';
    person1['age'] = 38;
    person1.greeting = function() {
    alert('Hi! I\'m ' + this.name + '.');
    };

    //or
    let person1 = new Object({
    name: 'Chris',
    age: 38,
    greeting: function() {
    alert('Hi! I\'m ' + this.name + '.');
    }
    });
  • Object.create(),但是ie8不支持
    1
    2
    #从已存在的对象中copy
    let person2 = Object.create(person1);

原型

对象的原型

Since ECMAScript 2015, you can access an object’s prototype object indirectly via Object.getPrototypeOf(obj).

1
2
# __proto__ 已废弃
Object.getPrototypeOf(p1)

构造函数的原型

也是对象,也存在属性和方法

1
Person.prototype;

两者关系
1
Object.getPrototypeOf(p1) === Person.prototype;

构造函数

构造

原型对象都有构造函数属性constructor,指向最开始的构造函数
也就是任何对象,都有构造函数属性

1
2
Object.getPrototypeOf(p1) == Person.prototype
p1.constructor() → Person.prototype.contructor()

call,修改函数指向为当前上下文

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 function Teacher(first, last, age, gender, interests, subject) {
Person.call(this, first, last, age, gender, interests);

this.subject = subject;
}
等效于
function Teacher(first, last, age, gender, interests, subject) {
this.name = {
first,
last
};
this.age = age;
this.gender = gender;
this.interests = interests;
this.subject = subject;
}

原型继承需要修改construcotr

Person.prototype.constructor指向Person,那么原型链上的Teacher.prototype与其实例constructor都会指向Person

1
Teacher.prototype = Object.create(Person.prototype);

修改Tearch.prototype,

1
2
3
4
Object.defineProperty(Teacher.prototype, 'constructor', { 
value: Teacher,
enumerable: false, // so that it does not appear in 'for in' loop
writable: true });

Class | extends

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
 class Person {
constructor(first, last, age, gender, interests) {
this.name = {
first,
last
};
this._age = age;
this.gender = gender;
this.interests = interests;
}

greeting() {
console.log(`Hi! I'm ${this.name.first}`);
};

farewell() {
console.log(`${this.name.first} has left the building. Bye for now!`);
};
get age(){
return this._age;
}
set age(value){
this._age = value;
}

}

参考

JavaScript

Objects

使用支付宝打赏
使用微信打赏

若你觉得我的文章对你有帮助,欢迎点击上方按钮对我打赏